#ifndef AST_TYPE
#define AST_TYPE

namespace AST {

    /**
     * Tipos de Dados
     *
     * Estrutura representante dos tipos encontrados para utilização na análise
     * semântica. Estes tipos necessitam ser armazenados numa estrutura
     * especializada pois armazenam duas informações importantes: tipo de
     * conteúdo e marcação como dimensional.
     *
     * @category AST
     * @package  AST
     */
    class Type {

    public:

        /**
         * Tipo de Conteúdo
         */
        enum Content { FLOAT, CHAR, INTEGER, VOID, UNKNOWN };

    private:

        /**
         * Conteúdo Configurado
         */
        Content _content;

        /**
         * Utilização Dimensional
         */
        bool _isArray;

    public:

        /**
         * Construtor Simples
         */
        Type(Content);

        /**
         * Construtor Completo
         */
        Type(Content, bool);

        /**
         * Configuração de Tipo de Conteúdo
         *
         * Armazena informações sobre o tipo de conteúdo encontrado durante
         * etapas de análise sintática ou semântica.
         *
         * @param  Content Conteúdo para Configuração
         * @return Próprio Objeto para Encadeamento
         */
        Type* setContent(Content);

        /**
         * Configuração de Utilização Dimensional
         *
         * Configurado para informar se o tipo utilizado pode ser considerado
         * como formato dimensional.
         *
         * @param  bool Conteúdo para Configuração
         * @return Próprio Objeto para Encadeamento
         */
        Type* setIsArray(bool);

        /**
         * Capturar Tipo de Conteúdo
         *
         * Apresenta o tipo configurado para o objeto atual, relacionado ao nó
         * de árvore abstrata de sintaxe.
         *
         * @return Valor Configurado
         */
        Content getContent();

        /**
         * Capturar Utilização Dimensional
         *
         * Apresenta se o tipo utilizado é processado como valor dimensional,
         * com acesso a posições em memória com relação ao endereço inicial.
         * Este valor é configurado durante a análise sintática.
         *
         * @return Valor Configurado
         */
        bool getIsArray();

    };

};

#endif

